package main

import "fmt"

/*
1、切片初始化时，var slice = arr[startIndex:endIndex]
说明：从arr数组下标为startIndex，取到下标为endIndex的元素（不含arr[endIndex]）
2、切片初始化时，仍然不能越界，范围在[0-len(arr)]之间，但是可以动态增长
(1)var slice = arr[0:end] 可以简写var slice = arr[:end]
(2)var slice = arr[start:len(arr)] 可以简写var slice = arr[start:]
(3)var slice = arr[0:len(arr)] 可以简写var slice = arr[:]
3、cap是一个内置函数，用于统计切片的容量，即最大可以存放多少个元素
4、切片定义完后，还不能使用，因为本身是一个空的，需要让其引用到一个数组，或者make一个空间供切片来使用
5、切片可以继续切片
6、用append内置函数，可以对切片进行动态追加
切片append操作的底层原理分析
(1)切片append操作的本质就是对数组扩容
(2)go底层会创建一个新的数组newArr(安装扩容后大小)
(3)将slice原来包含的元素拷贝到新的数组newArr
(4)slice重新引用到newArr
(5)注意newArr是在底层来维护的，程序员不可见
7、切片的拷贝操作
切片使用copy内置函数完成拷贝
说明：copy(para1,para2) para1和para2都是切片类型
8、切片是引用类型，所以在传递时，遵守引用传递机制
*/
func main() {
	//5
	var slice []int = make([]int, 5, 10)
	slice2 := slice[:]
	slice2[0] = 1
	fmt.Println("slice2=", slice2)
	fmt.Println("slice=", slice) //切片是引用类型，改变元素的值，同时也会改变引用的值

	//6
	var slice3 []int = []int{100, 200, 300}
	slice3 = append(slice3, 400, 500, 600)
	slice3 = append(slice3, slice3...) //通过append将切片slice3追加给slice3
	fmt.Println("slice3", slice3)

	//7
	var slice4 []int = []int{1, 2, 3, 4, 5}
	var slice5 = make([]int, 10)
	copy(slice5, slice4)
	fmt.Println("slice4=", slice4)
	fmt.Println("slice5=", slice5) //slice4和slice5的数据空间是独立的

}
